#ifndef MYTCPSOCKET_H
#define MYTCPSOCKET_H

#include <QObject>
#include <QTcpSocket>
#include"Protocol.h"
#include"dbmanager.h"
#include<QFile>
#include <QMutex>
#include<QTimer>
class MyTcpSocket : public QTcpSocket
{
    Q_OBJECT
public:
    explicit MyTcpSocket(QObject *parent = nullptr);

    ~MyTcpSocket();

    void copyDir(QString srcDir,QString destDir);
    QString getName();
    void setName(const QString &newName);

    void jointLog(const QString&txt,int flag=1);
    void setTcpId(int newTcpId);

    /**
     * 所有协议操作写成成员函数
     */
    //1.用户注册
    void registRequest(PDU* pdu);
    void handleRegistRequest(const QString &name,bool result,int tcpId);

    //2.用户登录
    void loginRequest(PDU *pdu);
    void handleLoginRequest(const QString&name,bool result,int tcpId);

    //3.查询所有在线用户
    void onlineUsersRequest();
    void handleOnlineUsersRequest(const QStringList &usrList,int tcpId);

    //4.根据用户名查找
    void searchUserRequest(PDU*pdu);
    void handleSearchResult(QList<UserInfo> resultList,int tcpId);
    //5.添加好友
    void addFriendRequest(PDU*pdu);
    void handleAddFriendRequest(int flag,int tcpId,const QString&addName,PDU*pdu);

    //6.同意添加好友
    void handleAddFriendAgree(PDU* pdu);

    //7.不同意添加好友
    void handleAddFriendDisagree(PDU* pdu);

    //8.刷新好友列表
    void flushFriendRequest(PDU*pdu);
    void handleFlushFriendRequest(const QStringList& usrList,int tcpId);

    //9.删除好友
    void deleteFriendRequest(PDU*pdu);
    void handleDeleteFriendRequest(bool result,int tcpId,const QString&delName,PDU*pdu);

    //10.群聊广播
    void groupChatRequest(PDU*pdu);
    void handleGroupChatRequest(const QStringList& usrList,int tcpId,PDU*pdu);

    //11.私聊

    void handlePrivateChatRequest(PDU*pdu);

    //12.用户下线
    void usrOfflineRequest(PDU*pdu);
    void handleUsrOfflineRequest(const QString &name,bool result,int tcpId);

    //获取在线好友列表
    void getOnlineFriRequest(PDU*pdu);
    void handleGetOnlineFriRequest(const QStringList& usrList,int tcpId);


    PDU* handleCreateDirRequest(PDU* pdu);

    PDU* handleFlushDirRequest(PDU* pdu);

    PDU* handleDelFileOrDirRequest(PDU* pdu);

    PDU* handleRenameFileRequest(PDU* pdu);

    PDU* handleEntryDirRequest(PDU* pdu);

    PDU* handleUploadFileRequest(PDU*pdu);

    PDU* handleDownloadFileRequest(PDU*pdu);

    PDU* handleMoveFileRequest(PDU*pdu);

    //21.用户注销请求
    void logoffRequest(PDU *pdu);
    void handleLogoffRequest(const QString&name,bool result,int tcpId);

    //用户修改信息请求
    void modifyInfoRequest(PDU *pdu);
    void handleModifyInfoRequest(const QString &name,bool result,int tcpId);
    //22
    void handleShareFileRequest(PDU*pdu);

    PDU* handleRecvFileRequest(PDU*pdu);

    void handleOnlineForwardFriendsRequest(const QStringList& usrList,int tcpId);
    void handleOfflineForwardFriendsRequest(const QString&usrName,const QStringList& usrList,int tcpId);


    /**
     * *************************************************************************************
     */



public slots:
    void recvMsg();

    //下载文件数据
    void downLoadFileData();

    void sendData(MyTcpSocket*tcpSocket,PDU *pdu);

signals:
    //客户端下线信号
    void offline(MyTcpSocket *socket);
    //转发消息信号
    void forwardMsg(const QString& desName,PDU *pdu);
    //日志信号
    void logSignal(const QString&logTxt);
    void registSignal(const QString& name,const QString& pwd,int currentId);
    void loginSignal(const QString& name, const QString& pwd,int currentId);
    void onlineSignalForward(const QString& name,int currentId);
    void offlineSignalForward(const QString& name,int currentId);
    void logoffSignal(const QString& name,int currentId);
    void modifyUsrInfoSignal(const QString& oldUsrName,
                      const QString& newUsrName,
                      const QString& newPwd,
                      int currentId);
    void usrOfflineSignal(const QString&name,int currentId);
    void searchOnlineUsrsSignal(int currentId);
    void searchOnlineFriendsSignal(const QString&usrName,int currentId);
    void searchUsrByNameSignal(const QString&searchName,const QString&usrName,int currentId);
    void addFriendSignal(const QString&addName,const QString&usrName,int currentId,PDU*pdu);
    void agreeAddFriendSignal(const QString&addName,const QString&usrName);
    void flushFriendSignal(const QString&name,int currentId);
    void deleteFriendSignal(const QString&usrName,const QString&delName,int currentId,PDU*pdu);
    void groupChatSignal(const QString&usrName,int currentId,PDU*pdu);
private:
    QMutex m_nameMutex;
    QString m_name;

    QMutex m_idMutex;
    int m_id;

    //下载文件计时器
    QTimer *m_timer;

    /**
     * 以下参数用于接收从客户端发送的文件数据
     */
    //文件
    QFile  m_file;
    //文件总大小
    qint64 m_total;
    //文件已接收大小
    qint64 m_recved;
    //是否为上传文件状态
    bool m_upLoad;

    int m_lastPercent = 0;
};

#endif // MYTCPSOCKET_H
